package modelo.geografia;

import java.util.ArrayList;
import java.util.Collections;
import java.util.List;

import modelo.ladron.Ladron;
import modelo.policia.Policia;
import modelo.policia.grado.Detective;
import modelo.policia.grado.Grado;
import modelo.policia.grado.Investigador;
import modelo.policia.grado.Novato;
import modelo.policia.grado.Sargento;


public class SistemaDeViajes {

	private Ciudad proximaCiudadCorrectaParaQueVayaElPolicia;
	private int cantidadDeCiudadesAMostrar;
	
	private double radianes(double anguloEnGrados){
		return (anguloEnGrados*Math.PI/180);
	}
	public int calcularDistanciaEnKmEntre2Ciudades(Ciudad ciudad1, Ciudad ciudad2){
		double R = 6378.137;
		double difLong = radianes((ciudad2.getPosicion().getLongitudEnGrados()) - (ciudad1.getPosicion().getLongitudEnGrados()));
		double latA = radianes((ciudad1.getPosicion().getLatitudEnGrados()));
		double latB = radianes((ciudad2.getPosicion().getLatitudEnGrados()));
		double dist = R * (Math.acos ((Math.sin (latA) * Math.sin(latB)) + (Math.cos (latA) * Math.cos (latB) * Math.cos (difLong))));
		return (int) dist;
	}
	public Ciudad getProximaCiudadCorrectaParaQueVayaElPolicia(){
		return proximaCiudadCorrectaParaQueVayaElPolicia;
	}
	public List<Ciudad> ofrecerCiudadesAlPolicia(Policia policiaJugando, Ladron ladron, List<Ciudad> ciudades){
		List<Ciudad> ciudadesParaOfrecer = new ArrayList<Ciudad>();
		int ultimaCiudadCorrecta = (policiaJugando.getCiudadesVisitadas().size()-1);
		int numeroEnRutaDeUltimaCiudadCorrecta = ladron.getRutaDeEscape().indexOf(policiaJugando.getCiudadesVisitadas().get(ultimaCiudadCorrecta));
				
		if (!(ultimaCiudadCorrecta == 0 )) ciudadesParaOfrecer.add(policiaJugando.getCiudadesVisitadas().get(ultimaCiudadCorrecta-1));
		
		if (!(numeroEnRutaDeUltimaCiudadCorrecta == ladron.getRutaDeEscape().size()-1)) proximaCiudadCorrectaParaQueVayaElPolicia = ladron.getRutaDeEscape().get(numeroEnRutaDeUltimaCiudadCorrecta+1);
		if(!(ciudadesParaOfrecer.contains(proximaCiudadCorrectaParaQueVayaElPolicia)))ciudadesParaOfrecer.add(proximaCiudadCorrectaParaQueVayaElPolicia);
		
		Ciudad ciudadExtraParaOfrecer = null;
		while ((ciudadesParaOfrecer.size())<(cantidadDeCiudadesAMostrar)){
			Collections.shuffle(ciudades);
			ciudadExtraParaOfrecer = ciudades.get(0);
			if ((!(ciudadesParaOfrecer.contains(ciudadExtraParaOfrecer)))&&(!(ciudadExtraParaOfrecer.getNombre().equals(policiaJugando.getCiudadActual().getNombre())))) ciudadesParaOfrecer.add(ciudadExtraParaOfrecer);
		}					
		Collections.shuffle(ciudadesParaOfrecer);	//mezcla la lista para que no queden siempre el correcto primero y los extra despues.	
		return ciudadesParaOfrecer;
	}
	public void setearCantidadDeCiudadesAMostrar(Grado grado){
		grado.setearCantidadDeCiudadesAMostrar(this);
	}
	public void setearCantidadDeCiudadesAMostrar(Novato novato) {
		this.cantidadDeCiudadesAMostrar=3;
	}
	public void setearCantidadDeCiudadesAMostrar(Detective detective) {
		this.cantidadDeCiudadesAMostrar=4;
	}
	public void setearCantidadDeCiudadesAMostrar(Investigador investigador) {
		this.cantidadDeCiudadesAMostrar=5;
	}
	public void setearCantidadDeCiudadesAMostrar(Sargento sargento) {
		this.cantidadDeCiudadesAMostrar=6;
	}
}
